home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 2 / MacMania 2.toast / Demo's / Tools&Utilities / Programming / PowerLisp 1.1 / Library / cl.lisp < prev    next >
Encoding:
Text File  |  1994-04-25  |  40.5 KB  |  1,585 lines  |  [TEXT/ROSA]

  1. ;;;
  2. ;;;        Copyright © 1994 Roger Corman.  All rights reserved.
  3. ;;;
  4.  
  5. ;
  6. ;        Lisp standard functions and macros to be loaded at startup.
  7. ;
  8.  
  9. (eval-when (:compile-toplevel :load-toplevel :execute)
  10.     (in-package :common-lisp))
  11.  
  12. (eval-when (:compile-toplevel :load-toplevel :execute)
  13. (export '(    when 
  14.             unless 
  15.             prog1 
  16.             prog2
  17.             loop 
  18.             assert
  19.             warn
  20.             push 
  21.             pushnew
  22.             pop 
  23.             ecase
  24.             incf 
  25.             decf 
  26.             remf
  27.             multiple-value-list 
  28.             multiple-value-setq
  29.             multiple-value-bind
  30.             functionp keywordp arrayp packagep bit-vector-p
  31.             string
  32.             position position-if position-if-not
  33.             find find-if find-if-not
  34.             count count-if count-if-not
  35.             fill replace
  36.             mismatch search
  37.             svref array-rank-limit array-dimension-limit array-total-size-limit
  38.             print
  39.             prin1
  40.             princ
  41.             mapcan
  42.             mapcon
  43.             copy-alist
  44.             read-from-string
  45.             with-output-to-string
  46.             read-function
  47.             prompt *prompt* 
  48.             disassemble
  49.             print-addr
  50.             print-code
  51.             copyright
  52.             require
  53.             provide
  54.             defasm
  55.             hex
  56.             compile
  57.             compile-file
  58.             compile-without-assembling
  59.             identity
  60.             finish-output force-output clear-output
  61.             parse-integer
  62.             psetq
  63.             do
  64.             do*
  65.             *features*
  66.             *modules*
  67.             *load-verbose*
  68.             *load-print*
  69.             *print-radix*
  70.             *print-circle*
  71.             *print-pretty*
  72.             *print-length*
  73.             *print-gensym*
  74.             *print-array*
  75.             *gc-verbose*
  76.             *lisp-file-extension*
  77.             *lisp-compiled-file-extension*
  78.             *library-directory*
  79.             *top-level*
  80.             pi
  81.             internal-time-units-per-second
  82.             defun defmacro deftype defstruct defpackage
  83.             time
  84.             ffloor fceiling ftruncate fround
  85.             signum
  86.             typecase
  87.             describe
  88.             get-properties copy-symbol
  89.             do-symbols do-all-symbols do-external-symbols find-all-symbols
  90.             logtest cis asinh acosh atanh
  91.             butlast nbutlast list-length
  92.             error-stack))
  93. ) ;; close eval-when
  94.             
  95. (setq *print-case* :downcase)    ; can be :upcase, :downcase or :capitalize
  96.  
  97. ; Some Common Lisp special variables
  98. (defvar *features* '(powerlisp))
  99. (defvar *modules* nil)
  100. (defvar *read-suppress* nil)
  101. (defvar *top-level* nil)
  102. (defvar *print-radix* nil)
  103. (defvar *print-circle* nil)
  104. (defvar *print-pretty* nil)
  105. (defvar *print-length* nil)
  106. (defvar *print-gensym* t)
  107. (defvar *print-array* t)
  108.  
  109. ;
  110. ;    The *library-directory* special variable is used by
  111. ;    the 'require' function to figure out where to load 
  112. ;    requested modules from.
  113. ;
  114. (defconstant *library-directory* ":library:") 
  115. (defconstant *lisp-file-extension* ".lisp")
  116. (defconstant *lisp-compiled-file-extension* ".fasl")
  117.  
  118. (defun compile (name &optional definition)
  119.     "Usage: (COMPILE function-name &optional lambda)"
  120.     (require :compiler)
  121.     (compiler::compile-it name definition))
  122.  
  123. (defun compile-file (input-file &key (output-file "untitled.fasl") print)
  124.     "Usage: (COMPILE-FILE input-filename :OUTPUT-FILE output-filename)"
  125.     (require :compiler)
  126.     (editor-message (format nil "Compiling file ~A…" input-file))
  127.     (compiler::compile-the-file input-file output-file print))
  128.  
  129. (defun compile-without-assembling (name &optional definition)
  130.     "Usage: (COMPILE-WITHOUT-ASSEMBLING function-name &optional lambda)"
  131.     (require :compiler)
  132.     (compiler::compile-without-assembling-it name definition))
  133.  
  134. ;
  135. ;    Common Lisp 'prog1' macro
  136. ;
  137. (defmacro prog1 (first-x &rest rest-x) 
  138.     `(let* ((a1 ,first-x)) 
  139.         ,@rest-x
  140.         a1))
  141.  
  142. ;
  143. ;    Common Lisp 'prog2' macro
  144. ;
  145. (defmacro prog2 (first-x second-x &rest rest-x) 
  146.     `(let* ((a1 ,first-x) (a2 ,second-x)) 
  147.         ,@rest-x
  148.         a2))
  149.  
  150. ;
  151. ;    Simple version of LOOP macro
  152. ;
  153. (defmacro loop (&rest forms)
  154.     (dolist (f forms)
  155.         (if (symbolp f)        ;; need expanded macro    
  156.             (progn
  157.                 (require :loop)
  158.                 (return-from loop `(loop ,@forms)))))
  159.     (let ((sym (gensym)))
  160.         `(block nil (tagbody ,sym ,@forms (go ,sym)))))
  161.  
  162. ;
  163. ;    Common Lisp 'assert' macro
  164. ;
  165. (defmacro assert (x) 
  166.     `(if (null ,x) (error "Assertion failed")))
  167.  
  168. ;
  169. ;    Common Lisp 'warn' function.
  170. ;    This should really go to error-output stream.
  171. ;
  172. (defun warn (format-string &rest args)
  173.     (format t "~%Warning: ")
  174.     (apply #'format t format-string args)
  175.     (format t "~%"))
  176.  
  177. ;
  178. ;    Common Lisp 'require' function.
  179. ;    The path-name option is not implemented yet.
  180. ;
  181. (defun require (module-name &optional path-name)
  182.     (if path-name
  183.         (progn
  184.             (format t "require: path-name option not implemented~%")
  185.             (format t "Searching default directory: ~A~%"
  186.                 *library-directory*)))
  187.                 
  188.     (if (symbolp module-name)
  189.         (setq module-name (symbol-name module-name)))
  190.  
  191.     ;; load the module if necessary
  192.     (if (not (member module-name *modules* :test #'equal))
  193.         (let ((filename (concatenate 'string *library-directory* 
  194.                     module-name *lisp-file-extension*))
  195.               (compiled-filename (concatenate 'string *library-directory* 
  196.                       module-name *lisp-compiled-file-extension*)))
  197.             (cond
  198.                 ((probe-file compiled-filename)
  199.                  (load compiled-filename))
  200.                 ((probe-file filename)
  201.                  (load filename))
  202.                 (t (error "Can't locate the required module: ~A~%" module-name)))))
  203.  
  204.     ;; if it still doesn't exist, signal an error
  205.     (if (not (member module-name *modules* :test #'equal))
  206.         (error "Could not provide the required module: ~A~%" module-name))
  207.     
  208.     module-name)
  209.  
  210. ;
  211. ;    Common Lisp 'provide' function.
  212. ;
  213. (defun provide (module-name)
  214.     (if (symbolp module-name)
  215.         (setq module-name (symbol-name module-name)))
  216.     (push module-name *modules*)
  217.     module-name)
  218.  
  219. (defun %once-only-forms (form)
  220.     (let* 
  221.         ((args (rest form)) ; raw form arguments
  222.          (letlist 
  223.             (let ((newlist nil))
  224.                 (dolist (x form)
  225.                     (when (consp x) 
  226.                         (push `(,(gensym) ,x) newlist)))
  227.                 (nreverse newlist)))
  228.          (revlist 
  229.             (let ((newlist nil))
  230.                 (dolist (x letlist)
  231.                     (push (cons (second x) (first x)) newlist))
  232.                 (nreverse newlist)))
  233.          (newform (cons (first form) (sublis revlist args))))
  234.         (cons letlist newform)))
  235.  
  236. (defmacro incf (form &optional (delta 1))
  237.     (if (and (consp form) (some #'consp form))
  238.         (let ((retval (%once-only-forms form)))
  239.             `(let ,(car retval) 
  240.                 (setf ,(cdr retval) (+ ,(cdr retval) ,delta))))
  241.         `(setf ,form (+ ,form ,delta))))
  242.  
  243. (defmacro decf (form &optional (delta 1))
  244.     (if (and (consp form) (some #'consp form))
  245.         (let ((retval (%once-only-forms form)))
  246.             `(let ,(car retval) 
  247.                 (setf ,(cdr retval) (- ,(cdr retval) ,delta))))
  248.         `(setf ,form (- ,form ,delta))))
  249.  
  250. (defmacro push (val form)
  251.     (if (and (consp form) (some #'consp form))
  252.         (let ((retval (%once-only-forms form)))
  253.             `(let ,(car retval) 
  254.                 (setf ,(cdr retval) (cons ,val ,(cdr retval)))))
  255.         `(setf ,form (cons ,val ,form))))
  256.  
  257. (defmacro pop (form)
  258.     (if (and (consp form) (some #'consp form))
  259.         (let ((retval (%once-only-forms form)))
  260.             `(let ,(car retval) 
  261.                 (prog1 (first ,(cdr retval))
  262.                     (setf ,(cdr retval) (rest ,(cdr retval))))))
  263.         `(prog1 (first ,form) (setf ,form (rest ,form)))))
  264.  
  265. (defmacro pushnew (val form &rest rest)
  266.     (if (and (consp form) (some #'consp form))
  267.         (let ((retval (%once-only-forms form)))
  268.             `(let ,(car retval) 
  269.                 (setf ,(cdr retval) (adjoin ,val ,(cdr retval) ,@rest))))
  270.         `(setf ,form (adjoin ,val ,form ,@rest))))
  271.  
  272.  
  273. ;    Common Lisp 'remf' macro
  274. ;    This currently does not completely conform to the standard because
  275. ;    subexpressions are evaluated twice.
  276. ;
  277. (defmacro remf (place indicator)
  278.     `(multiple-value-bind (plist flag) 
  279.         (%remove-property ,place ,indicator)
  280.         (setf ,place plist)
  281.         flag))
  282.  
  283. ;
  284. ;    Common Lisp 'multiple-value-list' macro
  285. ;
  286. (defmacro multiple-value-list (form)
  287.     `(multiple-value-call #'list ,form))
  288.  
  289. ;
  290. ;    Common Lisp 'multiple-value-setq' macro
  291. ;
  292. (defmacro multiple-value-setq (varlist form)
  293.     (let ((setq-forms nil) 
  294.           (value-list-sym (gensym)) 
  295.           (return-form-sym (gensym)))
  296.         (do ((v varlist (cdr v)) (count 0 (1+ count)))
  297.             ((null v))
  298.             (push 
  299.                 `(setq ,(car v) (nth ,count ,value-list-sym)) 
  300.                 setq-forms))
  301.         `(let* ((,value-list-sym (multiple-value-list ,form))
  302.                 (,return-form-sym (car ,value-list-sym)))
  303.             ,@(reverse setq-forms)
  304.             ,return-form-sym)))
  305.  
  306. ;
  307. ;    Common Lisp 'multiple-value-bind' macro
  308. ;
  309. (defmacro multiple-value-bind (vars value-form &rest forms)
  310.     (let ((sym (gensym)))
  311.         `(let ,vars 
  312.             (multiple-value-setq ,vars ,value-form)
  313.             ,@forms)))
  314.  
  315. (defmacro psetq (&rest args)
  316.     (let ((syms nil) 
  317.           (values nil) 
  318.           (newsym (gensym)))
  319.         (prog* ((a args) (index 0))
  320.             loop-label
  321.             (if (null a) (return))
  322.             (if (not (symbolp (car a)))
  323.                 (error "Not a symbol: ~A" (car a)))
  324.             (if (not (consp (cdr a)))
  325.                 (error "symbol ~A without value in psetq form" (car a)))
  326.             (push `(setq ,(car a) (nth ,index ,newsym)) syms)
  327.             (push (cadr a) values)
  328.             (setq a (cddr a))
  329.             (setq index (1+ index))
  330.             (go loop-label))
  331.         (setq syms (nreverse syms))
  332.         (setq values (nreverse values))
  333.         `(let ((,newsym (list ,@values)))
  334.             (progn ,@syms) nil)))
  335.  
  336. (defmacro do* (varlist return-clause &rest body)
  337.     (let ((local-vars nil)
  338.           (inc-expressions nil)
  339.           (label (gensym)))
  340.  
  341.         ;; collect variable and increment expressions
  342.         (prog* ((v varlist) sym)
  343.             loop-label
  344.             (if (null v) (return))
  345.             (setq sym (car v))
  346.             (if (consp sym)
  347.                 (if (consp (cdr sym))
  348.                         (progn
  349.                             (push (list (car sym) (cadr sym)) local-vars)
  350.                             (if (consp (cddr sym))
  351.                                 (progn
  352.                                     (push (car sym) inc-expressions)
  353.                                     (push (caddr sym) inc-expressions))))
  354.                     (push (car sym) local-vars))
  355.                 (if (not (symbolp sym))
  356.                     (error "Improper 'do*' expression--should be a symbol: ~A" sym)
  357.                     (push sym local-vars)))
  358.             (setq v (cdr v))
  359.             (go loop-label))
  360.  
  361.         (setq local-vars (nreverse local-vars))
  362.         (setq inc-expressions `(setq ,@(nreverse inc-expressions)))
  363.         (if (not (consp return-clause))
  364.             (error "Invalid return clause in 'do*' expression: ~A" 
  365.                 return-clause))
  366.         (setq return-clause 
  367.             `(if ,(car return-clause) (return (progn ,@(cdr return-clause)))))
  368.  
  369.         `(prog* ,local-vars
  370.                ,label
  371.                ,return-clause
  372.                ,@body
  373.                ,inc-expressions
  374.                (go ,label))))
  375.  
  376. (defmacro do (varlist return-clause &rest body)
  377.     (let ((local-vars nil)
  378.           (inc-expressions nil)
  379.           (label (gensym)))
  380.  
  381.         ;; collect variable and increment expressions
  382.         (prog* ((v varlist) sym)
  383.             loop-label
  384.             (if (null v) (return))
  385.             (setq sym (car v))
  386.             (if (consp sym)
  387.                 (if (consp (cdr sym))
  388.                         (progn
  389.                             (push (list (car sym) (cadr sym)) local-vars)
  390.                             (if (consp (cddr sym))
  391.                                 (progn
  392.                                     (push (car sym) inc-expressions)
  393.                                     (push (caddr sym) inc-expressions))))
  394.                     (push (car sym) local-vars))
  395.                 (if (not (symbolp sym))
  396.                     (error "Improper 'do' expression--should be a symbol: ~A" sym)
  397.                     (push sym local-vars)))
  398.             (setq v (cdr v))
  399.             (go loop-label))
  400.  
  401.         (setq local-vars (nreverse local-vars))
  402.         (setq inc-expressions `(psetq ,@(nreverse inc-expressions)))
  403.         (if (not (consp return-clause))
  404.             (error "Invalid return clause in 'do' expression: ~A" 
  405.                 return-clause))
  406.         (setq return-clause 
  407.             `(if ,(car return-clause) (return (progn ,@(cdr return-clause)))))
  408.  
  409.         `(prog ,local-vars
  410.                ,label
  411.                ,return-clause
  412.                ,@body
  413.                ,inc-expressions
  414.                (go ,label))))
  415.  
  416. ;
  417. ;    Common Lisp 'ecase' macro.
  418. ;
  419. (defmacro ecase (key &rest clauses)
  420.     `(case ,key ,@clauses (otherwise (error "No matching key found in ecase form."))))
  421.  
  422. ;
  423. ;    Set up the reader macro which allows for #| ... |# type comments
  424. ;
  425. (set-dispatch-macro-character #\# #\| 
  426.     #'(lambda (stream char int)
  427.             (do ((c (read-char stream) (read-char stream)))
  428.                  ((and (char= c #\|) (char= (peek-char nil stream) #\#))
  429.                          (read-char stream)(values)) nil)))
  430.  
  431. ;
  432. ;    Set up the reader macro which allows for #+ and #- conditional reads
  433. ;
  434. (defun %features-member (feature-list)
  435.     (if (symbolp feature-list)
  436.         (return (member feature-list *features*)))
  437.     (if (consp feature-list)
  438.         (ecase (car feature-list)
  439.             (and (every #'%features-member (cdr feature-list)))
  440.             (or  (some #'%features-member (cdr feature-list)))    
  441.             (not (notany #'%features-member (cdr feature-list))))
  442.         (error "~A is not a valid feature." feature-list)))
  443.  
  444.  
  445. (set-dispatch-macro-character #\# #\+ 
  446.     #'(lambda (stream char int)
  447.         (let ((feature (read stream)))
  448.             (if (%features-member feature)
  449.                 (return (read stream)))
  450.  
  451.             ; else need to skip over the next expression
  452.             (let ((*read-suppress* t))
  453.                 (read stream))
  454.             (return (values)))))
  455.  
  456. (set-dispatch-macro-character #\# #\- 
  457.     #'(lambda (stream char int)
  458.         (let ((feature (read stream)))
  459.             (if (not (%features-member feature))
  460.                 (return (read stream)))
  461.  
  462.             ; else need to skip over the next expression
  463.             (let ((*read-suppress* t))
  464.                 (read stream))
  465.             (return (values)))))
  466.  
  467. ;
  468. ;    Reader macro which handles #. syntax.
  469. ;
  470. (set-dispatch-macro-character #\# #\. 
  471.     #'(lambda (stream char int)
  472.         (eval (read stream))))
  473.  
  474. ;
  475. ;    Set up reader macro for octal, binary and hex numbers
  476. ;    #onnn -> octal, #bnnn ->binary, #xnnn ->hex
  477. ;
  478. (set-dispatch-macro-character #\# #\O 
  479.     #'(lambda (stream char int)
  480.         (let ((*read-base* 8)) 
  481.             (read stream))))
  482.  
  483. (set-dispatch-macro-character #\# #\B 
  484.     #'(lambda (stream char int)
  485.         (let ((*read-base* 2)) 
  486.             (read stream))))
  487.  
  488. (set-dispatch-macro-character #\# #\X 
  489.     #'(lambda (stream char int)
  490.         (let ((*read-base* 16))
  491.             (read stream))))
  492.  
  493. (set-dispatch-macro-character #\# #\R 
  494.     #'(lambda (stream char int)
  495.         (let ((*read-base* int))
  496.             (read stream))))
  497.  
  498. ;
  499. ;    SETF expansion functions
  500. ;
  501. (defmacro defsetf (sym func)
  502.     `(putprop ',sym 'cl::_setf_expansion_ ',func))
  503.  
  504. (defsetf symbol-value set)
  505. (defsetf symbol-function $set-symbol-function)
  506. (defsetf symbol-plist %set-symbol-plist)
  507. (defsetf macro-function $set-macro-function)
  508. (defsetf documentation put-documentation)
  509. (defsetf char common-lisp::%setchar)
  510. (defsetf schar common-lisp::%setchar)
  511. (defun %setcar (c x) (rplaca c x) x)
  512. (defsetf car %setcar)
  513. (defun %setcdr (c x) (rplacd c x) x)
  514. (defsetf cdr %setcdr)
  515. (defsetf rest %setcdr)
  516. (defun %setcaar (x val) (setf (car (car x)) val))
  517. (defsetf caar %setcaar)
  518. (defun %setcadr (x val) (setf (car (cdr x)) val))
  519. (defsetf cadr %setcadr)
  520. (defun %setcdar (x val) (setf (cdr (car x)) val))
  521. (defsetf cdar %setcdar)
  522. (defun %setcddr (x val) (setf (cdr (cdr x)) val))
  523. (defsetf cddr %setcddr)
  524. (defsetf elt setelt)
  525. (defsetf aref _set-aref)
  526. (defun svref (vec index) (elt vec index))
  527. (defun _setsvref (vec index val) (setelt vec index val))
  528. (defsetf svref _setsvref) 
  529. (defsetf get putprop)
  530. (defsetf gethash addhash)
  531. (defsetf fill-pointer _set_fill_pointer)
  532. (defun %setfirst (s x) (setelt s 0 x))
  533. (defsetf first %setfirst)
  534. (defun %setsecond (s x) (setelt s 1 x))
  535. (defsetf second %setsecond)
  536. (defun %setthird (s x) (setelt s 2 x))
  537. (defsetf third %setthird)
  538. (defun %setfourth (s x) (setelt s 3 x))
  539. (defsetf fourth %setfourth)
  540. (defun %setfifth (s x) (setelt s 4 x))
  541. (defsetf fifth %setfifth)
  542. (defun %setsixth (s x) (setelt s 5 x))
  543. (defsetf sixth %setsixth)
  544. (defun %setseventh (s x) (setelt s 6 x))
  545. (defsetf seventh %setseventh)
  546. (defun %seteighth (s x) (setelt s 7 x))
  547. (defsetf eighth %seteighth)
  548. (defun %setninth (s x) (setelt s 8 x))
  549. (defsetf ninth %setninth)
  550. (defun %settenth (s x) (setelt s 9 x))
  551. (defsetf tenth %settenth)
  552. ;
  553. ;    constants for Common Lisp
  554. (defconstant array-rank-limit 8)
  555. (defconstant array-dimension-limit 2147483647)
  556. (defconstant array-total-size-limit 2147483647) 
  557. (defconstant internal-time-units-per-second 1000000)
  558. (defconstant pi 3.14159265358979323846)
  559.  
  560. (defvar *load-verbose* nil) 
  561. (defvar *load-print* nil)
  562. (defvar *error-output* *terminal-io*)
  563.  
  564. (defun %is-binary (input-stream)
  565.     (let ((x (read-byte input-stream)))
  566.         (file-position input-stream 0)
  567.         (return (= x 0))))
  568.         
  569. (defun load (filename 
  570.         &key (verbose *load-verbose*) 
  571.              (print *load-print*) 
  572.              if-does-not-exist)
  573.     (let*
  574.         ((loaded 0)
  575.          (stream nil)
  576.          (binary nil)
  577.          (message (format nil "Loading file ~A…" filename))
  578.          (*package* *package*)            ;; bind these to themselves
  579.          (*readtable* *readtable*)
  580.          (*standard-output* *standard-output*))
  581.          
  582.         (if (symbolp filename)
  583.             (setq filename (symbol-name filename)))
  584.         (if (streamp filename)
  585.             (setq stream filename)
  586.             (if (not (stringp filename))
  587.                 (error "Invalid file name")))
  588.         
  589.         (unless stream (setq stream (open filename)))
  590.         (setq binary (%is-binary stream))
  591.  
  592.         (if binary 
  593.             (progn
  594.                 (if verbose
  595.                     (progn
  596.                         (format t ";;~%")
  597.                         (format t ";; Loading compiled file: ~A~%" filename)
  598.                         (format t ";;~%")))
  599.         
  600.                 (do* ((expr t) (symbol-table (make-array 500)))
  601.                     ((null expr)(close stream)(return-from load loaded))
  602.                     (editor-message message)
  603.                     (setq expr (%read-code-from-stream stream symbol-table))
  604.                     (if expr
  605.                         (let ((result (funcall expr)))
  606.                             (if print (print result))
  607.                             (incf loaded))))))
  608.  
  609.         (if verbose
  610.             (progn
  611.                 (format t ";;~%")
  612.                 (format t ";; Loading file: ~A~%" filename)
  613.                 (format t ";;~%")))
  614.         
  615.         (do* ((expr nil))
  616.             ((eq expr 'Eof)(close stream)(return-from load loaded))
  617.             (editor-message message)
  618.             (setq expr (read stream nil))
  619.             (if (not (eq expr 'Eof))
  620.                 (progn
  621.                     (setq expr (eval expr))
  622.                     (if print (print expr))
  623.                     (incf loaded))))))
  624.             
  625. ;;
  626. ;;    Common Lisp 'defun' macro.
  627. ;;    This redefines the built-in special form.
  628. ;;
  629. (defmacro defun (name lambda-list &rest forms)
  630.     (let ((doc-form nil) 
  631.           (lambda-form nil) 
  632.           (declarations nil))
  633.  
  634.         ;; look for declarations and doc string
  635.         (do* ((f forms (cdr f)))
  636.             ((null f) (setq forms f))
  637.             (if (and (typep (car f) 'string) (null doc-form) (cdr f))
  638.                 (setq doc-form 
  639.                     `((setf (documentation ',name 'function) ,(car f))))
  640.                 (if (and (consp (car f)) (eq (caar f) 'declare))
  641.                     (push (car f) declarations)
  642.                     (progn (setq forms f) (return)))))
  643.  
  644.         (setq lambda-form 
  645.             `(lambda ,lambda-list ,@(nreverse declarations)
  646.                 (block ,name ,@forms)))         
  647.         `(progn
  648.             ,@doc-form
  649.             (setf (symbol-function ',name) (function ,lambda-form))
  650.             ',name))) 
  651.  
  652. ;;
  653. ;;    Common Lisp 'defmacro' macro.
  654. ;;    This redefines the built-in special form.
  655. ;;
  656. (defmacro defmacro (name lambda-list &rest forms)
  657.     (let ((doc-form nil) 
  658.           (lambda-form nil)
  659.           (declarations nil))
  660.  
  661.         ;; look for declarations and doc string
  662.         (do* ((f forms (cdr f)))
  663.             ((null f) (setq forms f))
  664.             (if (and (typep (car f) 'string) (null doc-form) (cdr f))
  665.                 (setq doc-form 
  666.                     `((setf (documentation ',name 'macro) ,(car f))))
  667.                 (if (and (consp (car f)) (eq (caar f) 'declare))
  668.                     (push (car f) declarations)
  669.                     (progn (setq forms f) (return)))))
  670.  
  671.         (setq lambda-form 
  672.             `(lambda (form &optional env) 
  673.                 (destructuring-bind ,lambda-list 
  674.                     (cdr form)
  675.                     ,@(nreverse declarations) 
  676.                     (block ,name ,@forms)))) 
  677.         `(progn
  678.             ,@doc-form
  679.             (setf (macro-function ',name) (function ,lambda-form))
  680.             ',name))) 
  681.  
  682.  
  683. ;;
  684. ;;    Common Lisp 'deftype' macro.
  685. ;;
  686. (defmacro deftype (name lambda-list &rest forms)
  687.     (let ((doc-form nil) (lambda-form nil))
  688.         (if (and (typep (car forms) 'string) (cdr forms))
  689.             (progn
  690.                 (setq doc-form 
  691.                     `((setf (documentation ',name 'type) ,(car forms))))
  692.                 (setq forms (cdr forms))))
  693.  
  694.         (setq lambda-form 
  695.             `(lambda (form &optional env) 
  696.                 (type-destructuring-bind ,lambda-list 
  697.                     (cdr form) 
  698.                     (block ,name ,@forms)))) 
  699.         `(progn
  700.             ,@doc-form
  701.             (setf (get ',name '_type_expansion_) (function ,lambda-form))
  702.             (null-environment (get ',name '_type_expansion_))
  703.             ',name))) 
  704.  
  705. ;
  706. ;    Common Lisp 'defstruct' macro.
  707. ;
  708. (defmacro defstruct (name-and-options &rest doc-and-slots)
  709.     (require :structures)        ;; load module
  710.     `(defstruct ,name-and-options ,@doc-and-slots))
  711.  
  712. ;
  713. ;    Common Lisp 'defpackage' macro.
  714. ;
  715. (defmacro defpackage (name &rest options)
  716.     (require :defpackage)        ;; load module
  717.     `(defpackage ,name ,@options))
  718.  
  719. ;
  720. ;    Common Lisp 'in-package' macro
  721. ;
  722. (defmacro in-package (name)
  723.     `(eval-when (:load-toplevel :compile-toplevel :execute)
  724.         (let ((package (find-package ,name)))
  725.             (if package
  726.                 (setq *package* package)
  727.                 (setq *package* (make-package ,name))))))
  728.  
  729. ;
  730. ;    Common Lisp 'time' macro.
  731. ;
  732. ;
  733. (defmacro time (x)
  734.     `(let ((tm (get-internal-run-time)) ret)
  735.         (setq ret ,x)
  736.         (setq tm (- (get-internal-run-time) tm))
  737.         (decf tm (%elapsed-time nil))    ;; subtract timer overhead
  738.         (setq tm (/ (float tm) 1000000.0))
  739.         (format *trace-output* "Execution time: ~A seconds~%" tm)
  740.         ret))        
  741.  
  742. ; This private macro '%elapsed-time' acts like time, but returns the
  743. ; time elapsed after evaluating the passed expression.
  744. ;
  745. (defmacro %elapsed-time (x)
  746.     `(let ((tm (get-internal-run-time)) ret)
  747.         (setq ret ,x)
  748.         (setq tm (- (get-internal-run-time) tm))
  749.         tm))        
  750.         
  751. ;;;    Some standard predicates
  752. (defun functionp (x)     (typep x 'function))
  753. (defun keywordp (x)     (typep x 'keyword))
  754. (defun arrayp (x)         (typep x 'array))
  755. (defun packagep (x)     (typep x 'package))
  756. (defun bit-vector-p (x) (typep x 'bit-vector))
  757.  
  758. ;
  759. ;    Common Lisp 'string' function.
  760. ;
  761. (defun string (x)
  762.     (cond 
  763.         ((stringp x) x)
  764.         ((symbolp x) (symbol-name x))
  765.         ((characterp x)
  766.          (let ((string " ")) (setf (elt string 0) x) string))))
  767.  
  768. ;
  769. ;    Common Lisp 'position' function.
  770. ;
  771. (defun position (item sequence 
  772.         &key from-end (test #'eql) test-not (start 0) end key)
  773.     (unless (typep sequence 'sequence) 
  774.         (error "Not a sequence: ~A" sequence))
  775.     (unless (integerp end) 
  776.         (setq end (length sequence)))
  777.     (if test-not (setq test #'(lambda (x y) (not (funcall test-not x y)))))
  778.  
  779.     (if from-end
  780.         ;; loop backward
  781.         (do ((i (1- end) (- i 1))
  782.              (x))
  783.             ((< i start) nil)
  784.             (setq x (elt sequence i))
  785.             (if key (setq x (funcall key x)))
  786.             (if (funcall test item x)
  787.                 (return i)))
  788.  
  789.         ;;; else go forward
  790.         (do ((i start (+ i 1))
  791.              (x))
  792.             ((>= i end) nil)
  793.             (setq x (elt sequence i))
  794.             (if key (setq x (funcall key x)))
  795.             (if (funcall test item x)
  796.                 (return i)))))
  797.  
  798. ;
  799. ;    Common Lisp 'position-if' function.
  800. ;
  801. (defun position-if (test sequence 
  802.         &key from-end (start 0) end key)
  803.     (unless (typep sequence 'sequence) 
  804.         (error "Not a sequence: ~A" sequence))
  805.     (unless (functionp test) 
  806.         (error "Not a function: ~A" test))
  807.     (unless (integerp end) 
  808.         (setq end (length sequence)))
  809.  
  810.     (if from-end
  811.         ;; loop backward
  812.         (do ((i (1- end) (- i 1))
  813.              (x))
  814.             ((< i start) nil)
  815.             (setq x (elt sequence i))
  816.             (if key (setq x (funcall key x)))
  817.             (if (funcall test x)
  818.                 (return i)))
  819.  
  820.         ;;; else go forward
  821.         (do ((i start (+ i 1))
  822.              (x))
  823.             ((>= i end) nil)
  824.             (setq x (elt sequence i))
  825.             (if key (setq x (funcall key x)))
  826.             (if (funcall test x)
  827.                 (return i)))))
  828.  
  829. ;
  830. ;    Common Lisp 'position-if-not' function.
  831. ;
  832. (defun position-if-not (test sequence 
  833.         &key from-end (start 0) end key)
  834.     (unless (typep sequence 'sequence) 
  835.         (error "Not a sequence: ~A" sequence))
  836.     (unless (functionp test) 
  837.         (error "Not a function: ~A" test))
  838.     (unless (integerp end) 
  839.         (setq end (length sequence)))
  840.  
  841.     (if from-end
  842.         ;; loop backward
  843.         (do ((i (1- end) (- i 1))
  844.              (x))
  845.             ((< i start) nil)
  846.             (setq x (elt sequence i))
  847.             (if key (setq x (funcall key x)))
  848.             (if (not (funcall test x))
  849.                 (return i)))
  850.  
  851.         ;;; else go forward
  852.         (do ((i start (+ i 1))
  853.              (x))
  854.             ((>= i end) nil)
  855.             (setq x (elt sequence i))
  856.             (if key (setq x (funcall key x)))
  857.             (if (not (funcall test x))
  858.                 (return i)))))
  859.  
  860. ;
  861. ;    Common Lisp 'find' function.
  862. ;
  863. (defun find (item sequence 
  864.         &key from-end (test #'eql) test-not (start 0) end key)
  865.     (unless (typep sequence 'sequence) 
  866.         (error "Not a sequence: ~A" sequence))
  867.     (unless (integerp end) 
  868.         (setq end (length sequence)))
  869.     (if test-not (setq test #'(lambda (x y) (not (funcall test-not x y)))))
  870.  
  871.     (if from-end
  872.         ;; loop backward
  873.         (do ((i (1- end) (- i 1)) 
  874.              (x))
  875.             ((< i start) nil)
  876.             (setq x (elt sequence i))
  877.             (if key (setq x (funcall key x)))
  878.             (if (funcall test item x)
  879.                 (return x)))
  880.  
  881.         ;;; else go forward
  882.         (do ((i start (+ i 1)) 
  883.              (x))
  884.             ((>= i end) nil)
  885.             (setq x (elt sequence i))
  886.             (if key (setq x (funcall key x)))
  887.             (if (funcall test item x)
  888.                 (return x)))))
  889.  
  890. ;
  891. ;    Common Lisp 'find-if' function.
  892. ;
  893. (defun find-if (test sequence 
  894.         &key from-end (start 0) end key)
  895.     (unless (typep sequence 'sequence) 
  896.         (error "Not a sequence: ~A" sequence))
  897.     (unless (functionp test) 
  898.         (error "Not a function: ~A" test))
  899.     (unless (integerp end) 
  900.         (setq end (length sequence)))
  901.  
  902.     (if from-end
  903.         ;; loop backward
  904.         (do ((i (1- end) (- i 1)) 
  905.              (x))
  906.             ((< i start) nil)
  907.             (setq x (elt sequence i))
  908.             (if key (setq x (funcall key x)))
  909.             (if (funcall test x)
  910.                 (return x)))
  911.  
  912.         ;;; else go forward
  913.         (do ((i start (+ i 1)) 
  914.              (x))
  915.             ((>= i end) nil)
  916.             (setq x (elt sequence i))
  917.             (if key (setq x (funcall key x)))
  918.             (if (funcall test x)
  919.                 (return x)))))
  920.  
  921. ;
  922. ;    Common Lisp 'find-if-not' function.
  923. ;
  924. (defun find-if-not (test sequence 
  925.         &key from-end (start 0) end key)
  926.     (unless (typep sequence 'sequence) 
  927.         (error "Not a sequence: ~A" sequence))
  928.     (unless (functionp test) 
  929.         (error "Not a function: ~A" test))
  930.     (unless (integerp end) 
  931.         (setq end (length sequence)))
  932.  
  933.     (if from-end
  934.         ;; loop backward
  935.         (do ((i (1- end) (- i 1)) 
  936.              (x))
  937.             ((< i start) nil)
  938.             (setq x (elt sequence i))
  939.             (if key (setq x (funcall key x)))
  940.             (if (not (funcall test x))
  941.                 (return x)))
  942.  
  943.         ;;; else go forward
  944.         (do ((i start (+ i 1)) 
  945.              (x))
  946.             ((>= i end) nil)
  947.             (setq x (elt sequence i))
  948.             (if key (setq x (funcall key x)))
  949.             (if (not (funcall test x))
  950.                 (return x)))))
  951.  
  952. ;
  953. ;    Common Lisp 'count' function.
  954. ;
  955. (defun count (item sequence 
  956.         &key from-end (test #'eql) test-not (start 0) end key)
  957.     (unless (typep sequence 'sequence) 
  958.         (error "Not a sequence: ~A" sequence))
  959.     (unless (integerp end) 
  960.         (setq end (length sequence)))
  961.     (if test-not (setq test #'(lambda (x y) (not (funcall test-not x y)))))
  962.  
  963.     ;; we can ignore the :from-end key
  964.     (if key
  965.         (do ((i start (+ i 1))
  966.               (count 0))
  967.             ((>= i end) count)
  968.             (if (funcall test (funcall key (elt sequence i)) item)
  969.                 (incf count)))
  970.         ;; else
  971.         (do ((i start (+ i 1))
  972.               (count 0))
  973.             ((>= i end) count)
  974.             (if (funcall test (elt sequence i) item)
  975.                 (incf count)))))
  976.  
  977. ;
  978. ;    Common Lisp 'count-if' function.
  979. ;
  980. (defun count-if (test sequence 
  981.         &key from-end (start 0) end key)
  982.     (unless (typep sequence 'sequence) 
  983.         (error "Not a sequence: ~A" sequence))
  984.     (unless (functionp test) 
  985.         (error "Not a function: ~A" test))
  986.     (unless (integerp end) 
  987.         (setq end (length sequence)))
  988.  
  989.     ;; we can ignore the :from-end key
  990.     (if key
  991.         (do ((i start (+ i 1))
  992.               (count 0))
  993.             ((>= i end) count)
  994.             (if (funcall test (funcall key (elt sequence i)))
  995.                 (incf count)))
  996.         ;; else
  997.         (do ((i start (+ i 1))
  998.               (count 0))
  999.             ((>= i end) count)
  1000.             (if (funcall test (elt sequence i))
  1001.                 (incf count)))))
  1002.  
  1003. ;
  1004. ;    Common Lisp 'count-if-not' function.
  1005. ;
  1006. (defun count-if-not (test sequence 
  1007.         &key from-end (start 0) end key)
  1008.     (unless (typep sequence 'sequence) 
  1009.         (error "Not a sequence: ~A" sequence))
  1010.     (unless (functionp test) 
  1011.         (error "Not a function: ~A" test))
  1012.     (unless (integerp end) 
  1013.         (setq end (length sequence)))
  1014.  
  1015.     ;; we can ignore the :from-end key
  1016.     (if key
  1017.         (do ((i start (+ i 1))
  1018.               (count 0))
  1019.             ((>= i end) count)
  1020.             (if (not (funcall test (funcall key (elt sequence i))))
  1021.                 (incf count)))
  1022.         ;; else
  1023.         (do ((i start (+ i 1))
  1024.               (count 0))
  1025.             ((>= i end) count)
  1026.             (if (not (funcall test (elt sequence i)))
  1027.                 (incf count)))))
  1028.  
  1029. ;
  1030. ;    Common Lisp 'fill' function.
  1031. ;
  1032. (defun fill (sequence item &key (start 0) end)
  1033.     (unless (typep sequence 'sequence) 
  1034.         (error "Not a sequence: ~A" sequence))
  1035.     (unless (integerp end) 
  1036.         (setq end (length sequence)))
  1037.     (dotimes (i (- end start))
  1038.         (setf (elt sequence (+ i start)) item))
  1039.     sequence)
  1040.  
  1041. ;
  1042. ;    Common Lisp 'replace' function.
  1043. ;
  1044. (defun replace (sequence1 sequence2 &key (start1 0) end1 (start2 0) end2)
  1045.     (unless (typep sequence1 'sequence) 
  1046.         (error "Not a sequence: ~A" sequence1))
  1047.     (unless (typep sequence2 'sequence) 
  1048.         (error "Not a sequence: ~A" sequence2))
  1049.     (unless (integerp end1) 
  1050.         (setq end1 (length sequence1)))
  1051.     (unless (integerp end2) 
  1052.         (setq end2 (length sequence2)))
  1053.     (dotimes (i (min (- end1 start1) (- end2 start2)))
  1054.         (setf (elt sequence1 (+ i start1)) (elt sequence2 (+ i start2))))
  1055.     sequence1)
  1056.  
  1057. ;
  1058. ;    Common Lisp 'mismatch' function.
  1059. ;
  1060. (defun mismatch (sequence1 sequence2 
  1061.         &key (from-end nil)
  1062.              (test #'eql) 
  1063.              (test-not nil)
  1064.              (key nil)
  1065.              (start1 0) 
  1066.              (start2 0)
  1067.              (end1 (length sequence1))
  1068.              (end2 (length sequence2)))
  1069.  
  1070.     (unless (typep sequence1 'sequence)
  1071.         (error "Not a sequence: ~A" sequence1))
  1072.     (unless (typep sequence2 'sequence)
  1073.         (error "Not a sequence: ~A" sequence2))
  1074.     (if test-not (setq test #'(lambda (x y) (not (funcall test-not x y)))))
  1075.  
  1076.     (if from-end
  1077.         ;; loop backward
  1078.         (do* ((i1 start1 (1+ i1))
  1079.               (i2 start2 (1+ i2)) 
  1080.               x1 x2)
  1081.             ((and (>= i1 end1) (>= i2 end2)) nil)
  1082.             (if (>= i1 end1) (return i1))
  1083.             (if (>= i2 end2) (return i1))
  1084.             (setq x1 (elt sequence1 i1))
  1085.             (setq x2 (elt sequence2 i2))
  1086.             (if key 
  1087.                 (progn
  1088.                     (setq x1 (funcall key x1))
  1089.                     (setq x2 (funcall key x2))))
  1090.             (unless (funcall test x1 x2)
  1091.                 (return i1)))
  1092.  
  1093.         ;;; else go forward
  1094.         (do* ((i1 start1 (1+ i1))
  1095.               (i2 start2 (1+ i2))
  1096.               x1 x2)
  1097.             ((and (>= i1 end1) (>= i2 end2)) nil)
  1098.             (if (>= i1 end1) (return i1))
  1099.             (if (>= i2 end2) (return i1))
  1100.             (setq x1 (elt sequence1 i1))
  1101.             (setq x2 (elt sequence2 i2))
  1102.             (if key
  1103.                 (progn
  1104.                     (setq x1 (funcall key x1))
  1105.                     (setq x2 (funcall key x2))))
  1106.             (unless (funcall test x1 x2)
  1107.                 (return i1)))))
  1108.  
  1109. ;
  1110. ;    Common Lisp 'search' function.
  1111. ;
  1112. (defun search (sequence1 sequence2 
  1113.         &key (from-end nil)
  1114.              (test #'eql) 
  1115.              (test-not nil)
  1116.              (key nil)
  1117.              (start1 0) 
  1118.              (start2 0)
  1119.              (end1 (length sequence1))
  1120.              (end2 (length sequence2)))
  1121.  
  1122.     (unless (typep sequence1 'sequence)
  1123.         (error "Not a sequence: ~A" sequence1))
  1124.     (unless (typep sequence2 'sequence)
  1125.         (error "Not a sequence: ~A" sequence2))
  1126.     (if test-not (setq test #'(lambda (x y) (not (funcall test-not x y)))))
  1127.  
  1128.     (if from-end
  1129.         ;; loop backward
  1130.         (do* ((i (1- end2) (1- i)) 
  1131.               compare)
  1132.             ((< i start2) nil)
  1133.             (setq compare (mismatch sequence1 sequence2 :test test
  1134.                     :key key :start1 start1 :end1 end1 :start2 i))
  1135.             (if (or (null compare) (>= compare end1))
  1136.                 (return i)))
  1137.  
  1138.         ;;; else go forward
  1139.         (do* ((i start2 (1+ i)) 
  1140.               compare)
  1141.             ((>= i end2) nil)
  1142.             (setq compare (mismatch sequence1 sequence2 :test test
  1143.                     :key key :start1 start1 :end1 end1 :start2 i))
  1144.             (if (or (null compare) (>= compare end1))
  1145.                 (return i)))))
  1146.  
  1147. ;
  1148. ;    Common Lisp 'prin1' function.
  1149. ;
  1150. (defun prin1 (object &optional (output-stream *standard-output*))
  1151.     (write object :stream output-stream :escape t))
  1152.  
  1153. ;
  1154. ;    Common Lisp 'print' function.
  1155. ;
  1156. (defun print (object &optional (output-stream *standard-output*))
  1157.     (terpri output-stream)
  1158.     (prin1 object output-stream)
  1159.     (prin1 #\Space output-stream))
  1160.  
  1161. ;
  1162. ;    Common Lisp 'princ' function.
  1163. ;
  1164. (defun princ (object &optional (output-stream *standard-output*))
  1165.     (write object :stream output-stream :escape nil))
  1166.  
  1167. ;
  1168. ;    Common Lisp 'mapcan' function.
  1169. ;
  1170. (defun mapcan (func list &rest more-lists)
  1171.     (apply #'nconc (apply #'mapcar (cons func (cons list more-lists)))))
  1172.  
  1173. ;
  1174. ;    Common Lisp 'mapcon' function.
  1175. ;
  1176. (defun mapcon (func list &rest more-lists)
  1177.     (apply #'nconc (apply #'maplist (cons func (cons list more-lists)))))
  1178.  
  1179. (defun copy-alist (alist)
  1180.     (let ((newlist nil))
  1181.         (dolist (n alist)
  1182.             (push 
  1183.                 (if (consp n)
  1184.                     (cons (car n) (cdr n))
  1185.                     n)
  1186.                 newlist))
  1187.         (nreverse newlist)))
  1188.  
  1189. ;
  1190. ;    Common Lisp 'read-from-string' function.
  1191. ;    To do: handle eof-error, eof-value, preserve-whitespace settings    
  1192. ;
  1193. (defun read-from-string (string &optional eof-error eof-value 
  1194.             &key (start 0) end preserve-whitespace 
  1195.             &aux string-stream expr position)
  1196.     (if (not (typep string 'string)) (error "Not a string"))
  1197.     (if (not end) (setq end (length string)))
  1198.     (setq string-stream (make-string-input-stream string start end))
  1199.     (setq expr (read string-stream))
  1200.     (setq position (file-position string-stream))
  1201.     (if (eq position 'Eof) (setq position (- end start)))
  1202.     (values expr position))    
  1203.  
  1204. ;
  1205. ;    Common Lisp 'with-output-to-string' macro.
  1206. ;
  1207. (defmacro with-output-to-string ((var &optional string) &rest forms)
  1208.     `(let ((,var (make-string-output-stream)) (ret ,string) string)    
  1209.         (unwind-protect
  1210.             (progn
  1211.                 (let ()        ; establish a let block to allow declarations
  1212.                     ,@forms)
  1213.                 (setq string (get-output-stream-string ,var))
  1214.                 (if ret
  1215.                     (dotimes (i (length string))
  1216.                         (vector-push-extend (elt string i) ret))
  1217.                     (setq ret string)))
  1218.             (close ,var))
  1219.         ret))
  1220.  
  1221. ;;
  1222. ;;    Normal top level user input function.
  1223. ;;    This will get executed at startup and for the duration of an
  1224. ;;    interactive session.
  1225. ;;    By default, this function is the value of the variable *top-level*.
  1226. ;;
  1227. (defun top-level ()
  1228.     (do (expr)
  1229.         (nil)
  1230.         (catch 'common-lisp::%error
  1231.             (progn
  1232.                 (setq *read-level* 0)
  1233.                 (setq expr (read))
  1234.                 (if (eq expr 'quit)
  1235.                     (return))
  1236.                 (if (eq expr 'Eof)
  1237.                     (return 'Eof))
  1238.                 (editor-message "Thinking…")    ;; display status message
  1239.                 (setq expr (multiple-value-list (eval expr)))
  1240.                 (format t "~A~{ ~A~}~%" (car expr) (cdr expr))))))
  1241.  
  1242. (setq *top-level* #'common-lisp::top-level)
  1243.  
  1244. ;
  1245. ;    Common Lisp 'identity' function.
  1246. ;
  1247. (defun identity (object) object)
  1248.  
  1249. (defun finish-output (&optional (stream *standard-output*)) 
  1250.     (file-flush stream))
  1251.  
  1252. (defun force-output (&optional (stream *standard-output*)) 
  1253.     (file-flush stream))
  1254.  
  1255. (defun clear-output (&optional (stream *standard-output*)) 
  1256.     (file-flush stream))
  1257.  
  1258. (defun parse-integer (string 
  1259.         &key (start 0) 
  1260.              (end (length string))
  1261.              (radix 10)
  1262.              (junk-allowed nil)
  1263.         &aux (result 0)
  1264.              (state :initial)
  1265.              (sign 1)
  1266.              c)
  1267.  
  1268.     ;; check for leading sign
  1269.     (setf c (char string start))
  1270.     (if (char= c #\-)
  1271.         (progn (setf sign -1) (incf start))
  1272.         (if (char= c #\+)
  1273.             (incf start)))
  1274.  
  1275.     (do* ((i start (+ i 1))
  1276.           (n 0))
  1277.         ((>= i end))
  1278.         (setq c (char string i))
  1279.         (setq n (digit-char-p c radix))
  1280.         (cond
  1281.             (n (progn
  1282.                 (cond
  1283.                     ((eq state :finished) 
  1284.                      (if (not junk-allowed)
  1285.                         (error "Invalid integer parsed: ~A" string)
  1286.                         (progn (setq end i) (return)))))
  1287.                 (setq result (+ (* result radix) n))
  1288.                 (setq state :collecting)))
  1289.             
  1290.             ((member c '(#\Newline #\Space #\Tab))
  1291.                 (cond
  1292.                     ((eq state :collecting) (setq state :finished))
  1293.                     ((eq state :initial) nil)    ; don't do anything
  1294.                     ((eq state :finished) nil)))
  1295.             (t 
  1296.                 (if (not junk-allowed)
  1297.                     (error "Invalid integer parsed: ~A" string)
  1298.                     (progn (setq end i) (return))))))
  1299.  
  1300.     (if (eq state :initial)
  1301.         (setq result nil)
  1302.         (setq result (* result sign)))
  1303.     (values result end))
  1304.  
  1305.  
  1306. ;;; load the backquote facility
  1307. (require :backquote)        ; cause this to be loaded now
  1308.  
  1309. ;;; load the format facility
  1310. (require :format)            ; cause this to be loaded now
  1311.  
  1312. ; (require :cl-working)        ; additional stuff
  1313.                 
  1314. ;
  1315. ;    This allows the #{ (assembly code) } syntax
  1316. ;
  1317. (set-dispatch-macro-character #\# #\{ 
  1318.     #'(lambda (stream char int)
  1319.         (require :assembler)
  1320.         (let ((*package* (find-package :assembler))) 
  1321.             (assemble (read-delimited-list #\} stream) nil))))
  1322.  
  1323. (defun defasm (&rest x)
  1324.     (error "Assembler package not loaded"))
  1325.  
  1326. (defun hex (x)
  1327.     (let ((*print-base* 16))
  1328.         (write x))
  1329.     (values))
  1330.  
  1331. (defun disassemble (a) 
  1332.     (let ((*print-base* 16)) 
  1333.         (format t "~{~A~%~}" (disassembly-list a))))
  1334.  
  1335. (defun prompt () 
  1336.     (let ((savep *print-escape*))
  1337.         (setq *print-escape* nil)
  1338.         (write "free: ") 
  1339.         (write (free)) 
  1340.         (write ">") 
  1341.         (write "\n")
  1342.         (setq *print-escape* savep)))
  1343.  
  1344. ;; Print an executable address in hex
  1345. (defun print-code (x)
  1346.     (let ((*print-base* 16))
  1347.         (print (exec-address x))))
  1348.  
  1349. ;; Print an object address in hex
  1350. (defun print-addr (x)
  1351.     (let ((*print-base* 16))
  1352.         (print (address x))))
  1353.         
  1354. (defun gc-hook-default-function (nodes-freed)
  1355.     (if *gc-verbose*
  1356.         (progn
  1357.             (format t "Garbage collection: ~A nodes were freed.~%" nodes-freed)
  1358.             (file-flush))))
  1359.  
  1360. (defvar *gc-hook* #'gc-hook-default-function)
  1361. (defvar *gc-verbose* nil)        ;; set this to T to get garbage collection messages
  1362.  
  1363. (defun ffloor (number &optional (divisor 1))
  1364.     (multiple-value-bind (num div) 
  1365.         (floor number divisor)
  1366.         (values (float num) div)))
  1367.  
  1368. (defun fceiling (number &optional (divisor 1))
  1369.     (multiple-value-bind (num div) 
  1370.         (ceiling number divisor)
  1371.         (values (float num) div)))
  1372.  
  1373. (defun ftruncate (number &optional (divisor 1))
  1374.     (multiple-value-bind (num div) 
  1375.         (truncate number divisor)
  1376.         (values (float num) div)))
  1377.  
  1378. (defun fround (number &optional (divisor 1))
  1379.     (multiple-value-bind (num div) 
  1380.         (round number divisor)
  1381.         (values (float num) div)))
  1382.  
  1383. (defun get-properties (place indicator-list)
  1384.     (do ((n place (cddr n)))
  1385.         ((< (length n) 2) (values nil nil nil))
  1386.         (let ((x (member (car n) indicator-list)))
  1387.             (if x
  1388.                 (return (values (car n) (cadr n) n))))))
  1389.  
  1390. (defun copy-symbol (sym &optional copy-props)
  1391.     (let ((new-symbol (make-symbol (symbol-name sym))))
  1392.         (if copy-props
  1393.             (progn
  1394.                 (if (boundp sym)
  1395.                     (setf (symbol-value new-symbol) (symbol-value sym)))
  1396.                 (setf (symbol-plist new-symbol) (copy-list (symbol-plist sym)))))
  1397.         new-symbol))
  1398.  
  1399. ;
  1400. ;    Set up the reader macro which allows for #:sym syntax
  1401. ;
  1402. (set-dispatch-macro-character #\# #\: 
  1403.     #'(lambda (stream char int)
  1404.         (let ((*package* nil))
  1405.             (read stream))))
  1406.  
  1407. (defsetf getf %setf-getf)
  1408.  
  1409. (defun error-stack () 
  1410.     "Usage: (error-stack)
  1411.         Prints a dump of the processor stack state when the last error 
  1412.         occurred"
  1413.     (dolist (i *stack-trace*) (print i)))
  1414.  
  1415. (defun signum (x)
  1416.    (cond ((not (numberp x)) (error "Not a number: ~A" x))
  1417.          ((zerop x) x)
  1418.           (t (/ x (abs x)))))
  1419.  
  1420. (defmacro typecase (keyform &rest clauses)
  1421.     (let ((new-symbol (gensym)))
  1422.         (dolist (n clauses)
  1423.             (setf (car n) `(typep ,new-symbol ',(car n))))
  1424.         `(let ((,new-symbol ,keyform))
  1425.             (cond ,@clauses))))
  1426.  
  1427. (defun describe (obj)
  1428.     (require :describe)        ;; load module
  1429.     (cl::%describe obj))
  1430.  
  1431. (set-dispatch-macro-character #\# #\C 
  1432.     #'(lambda (stream char int)
  1433.         (let* ((*read-base* 10)
  1434.                (nums (read stream)))
  1435.             (complex (car nums) (cadr nums)))))
  1436.  
  1437. (defun cl::%do-symbols-get-symbol ()
  1438.     (prog* (sym flag)
  1439.         loop
  1440.         (if (null *do-symbols-packages*) (return (values nil nil)))
  1441.         (multiple-value-setq (sym flag) 
  1442.             (%package-next-symbol (car *do-symbols-packages*)))
  1443.         (unless flag 
  1444.             (progn
  1445.                 (setq *do-symbols-packages* (cdr *do-symbols-packages*))
  1446.                 (if (null *do-symbols-packages*) (return (values nil nil)))
  1447.                 (multiple-value-setq (sym flag) 
  1448.                     (%package-first-symbol (car *do-symbols-packages*)))))
  1449.         (if flag (return (values sym t)))
  1450.         (go loop)))
  1451.  
  1452. (defmacro do-symbols ((var package result-form) &rest forms)
  1453.     `(let ((pk (find-package ,package)) 
  1454.             packs 
  1455.             *do-symbols-packages*)
  1456.         (declare (special *do-symbols-packages*))
  1457.         (unless pk (setq pk *package*))
  1458.         (setq *do-symbols-packages* (cons pk (package-use-list pk)))
  1459.         (do* ((,var (%package-first-symbol pk) (cl::%do-symbols-get-symbol)))
  1460.              ((null *do-symbols-packages*) (progn (setq ,var nil) ,result-form))
  1461.              ,@forms)))
  1462.  
  1463. (defmacro do-all-symbols ((var result-form) &rest forms)
  1464.     `(let (*do-symbols-packages*)
  1465.         (declare (special *do-symbols-packages*))
  1466.         (setq *do-symbols-packages* (list-all-packages))
  1467.         (do* ((,var (%package-first-symbol (car *do-symbols-packages*)) 
  1468.                 (cl::%do-symbols-get-symbol)))
  1469.              ((null *do-symbols-packages*) (progn (setq ,var nil) ,result-form))
  1470.              ,@forms)))
  1471.  
  1472. (defun cl::%do-external-symbols-get-symbol ()
  1473.     (prog* (sym flag)
  1474.         loop
  1475.         (if (null *do-symbols-packages*) (return (values nil nil)))
  1476.         (multiple-value-setq (sym flag) 
  1477.             (%package-next-extern-symbol (car *do-symbols-packages*)))
  1478.         (unless flag 
  1479.             (progn
  1480.                 (setq *do-symbols-packages* (cdr *do-symbols-packages*))
  1481.                 (if (null *do-symbols-packages*) (return (values nil nil)))
  1482.                 (multiple-value-setq (sym flag) 
  1483.                     (%package-first-extern-symbol (car *do-symbols-packages*)))))
  1484.         (if flag (return (values sym t)))
  1485.         (go loop)))
  1486.  
  1487. (defmacro do-external-symbols ((var package result-form) &rest forms)
  1488.     `(let ((pk (find-package ,package)) 
  1489.             packs 
  1490.             *do-symbols-packages*)
  1491.         (declare (special *do-symbols-packages*))
  1492.         (unless pk (setq pk *package*))
  1493.         (setq *do-symbols-packages* (cons pk (package-use-list pk)))
  1494.         (do* ((,var (%package-first-extern-symbol pk) 
  1495.                 (cl::%do-external-symbols-get-symbol)))
  1496.              ((null *do-symbols-packages*) (progn (setq ,var nil) ,result-form))
  1497.              ,@forms)))
  1498.  
  1499. (defun find-all-symbols (name &aux (list nil))
  1500.     (if (symbolp name) (setq name (symbol-name name)))
  1501.     (do-all-symbols (x) 
  1502.         (if (string= (symbol-name x) name) (push x list)))
  1503.     list)
  1504.  
  1505. ;; Hyperbolic functions    Ken Whedbee  from CLtL
  1506.  
  1507. (defun logtest (x y) (not (zerop (logand x y))))
  1508. (defconstant imag-one #C(0.0 1.0))
  1509. (defun cis (x) (exp (* imag-one x)))
  1510.  
  1511. (defun asinh (x) (log (+ x (sqrt (+ 1.0 (* x x))))))
  1512. (defun acosh (x) (log (+ x (* (1+ x) (sqrt (/ (1- x) (1+ x)))))))
  1513. (defun atanh (x)
  1514.     (when (or (= x 1.0) (= x -1.0))
  1515.         (error "logarithmic singularity" x))
  1516.     (log (/ (1+ x) (sqrt (- 1.0 (* x x))))))
  1517.  
  1518. (defun butlast (x &optional (n 1))
  1519.     (let ((length (- (length x) n)))
  1520.         (if (minusp n)
  1521.             (error "butlast: negative index"))
  1522.         (if (<= length 0)
  1523.             nil
  1524.             (subseq x 0 length))))
  1525.  
  1526. (defun nbutlast (x &optional (n 1))
  1527.     (let ((length (- (length x) n)))
  1528.         (if (minusp n)
  1529.             (error "nbutlast: negative index"))
  1530.         (if (<= length 0)
  1531.             nil
  1532.             (progn
  1533.                 (setf (cdr (nthcdr (1- length) x)) nil)
  1534.                 x))))
  1535.  
  1536. (defun list-length (x)
  1537.     (do ((n 0 (+ n 2))
  1538.          (fast x (cddr fast))
  1539.          (slow x (cddr slow)))
  1540.         (nil)
  1541.         (when (endp fast) (return n))
  1542.         (when (endp (cdr fast)) (return (+ n 1)))
  1543.         (when (and (eq fast slow) (> n 0)) (return nil))))
  1544.  
  1545. (defun apply-arg-rotate (f args) 
  1546.     (apply f (car (last args)) (butlast args)))
  1547.  
  1548. (defmacro defsetf (sym first &rest rest)
  1549.     (if (symbolp first)
  1550.         `(progn (cl::putprop ',sym 'cl::_setf_expansion_ ',first) ',sym)
  1551.         (let ((f `#'(lambda ,(append (car rest) first) ,@(cdr rest)))
  1552.             (args (gensym)))
  1553.             `(progn
  1554.                 (setf (get ',sym 'cl::_setf_expansion_)
  1555.                     #'(lambda (&rest ,args) (apply-arg-rotate ,f ,args)))
  1556.                 ',sym))))
  1557.  
  1558. (defsetf subseq (sequence start &optional end) (new-sequence)
  1559.     `(progn 
  1560.         (replace ,sequence ,new-sequence 
  1561.                 :start1 ,start :end1 ,end)
  1562.         ,new-sequence))
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.